﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

using X3DXNA.X3DSchema;
using X3DXNA.utils;
using X3DXNA.basicModels;
using X3DXNA.debug;
using X3DXNA.interfaces;
using X3DXNA.core.CustomNodes;

namespace X3DXNA.core.Controllers
{
    class MaterialController
    {
        List<IUsable> materials;
        Debug debugSystem;

        public MaterialController(Debug debugSystem)
        {
            materials = new List<IUsable>();
            this.debugSystem = debugSystem;
        }

        /// <summary>
        /// Gestore di materiali. Dato che in X3D un materiale può essere riutilizzato mediante il suo DEF, questo gestore
        /// controlla se un materiale è già presente nel database, e, se non lo è, lo aggiunge.
        /// </summary>
        /// <param name="m">Struttura X3D "Material"</param>
        /// <returns>Classe MyMaterial</returns>
        public MyMaterial handleMaterial(Material m)
        {
            if (m != null && m.USE == null)
            {
                MyMaterial newMaterial = new MyMaterial();
                newMaterial.DEF = m.DEF;
                if (m.diffuseColor != null)
                    newMaterial.diffuseColor = utility.stringToVector3(m.diffuseColor);
                if (m.emissiveColor != null)
                    newMaterial.emissiveColor = utility.stringToVector3(m.emissiveColor);
                if (m.specularColor != null)
                    newMaterial.specularColor = utility.stringToVector3(m.specularColor);
                if (m.shininess != null)
                    newMaterial.shininess = utility.stringToFloat(m.shininess);
                if(m.ambientIntensity != null)
                    newMaterial.ambientIntensity = utility.stringToFloat(m.ambientIntensity);
                if (m.transparency != null)
                    newMaterial.transparency = utility.stringToFloat(m.transparency);

                materials.Add(newMaterial);
                return newMaterial;
            }
            else if (m.USE != null)
            {
                MyMaterial material = (MyMaterial)utility.findUsable(materials, m.USE);
                if (material != null)
                    return material;
                else
                {
                    debugSystem.addMessage("Attenzione, utilizzo di USE improprio: Non è stata trovato alcun Material definito con il tag DEF = " + m.USE + ". Verrà utilizzato un materiale standard.", typeof(MaterialController));
                    return new MyMaterial();
                }
            }
            else 
                return new MyMaterial();
        }
    }
}
